//基于数组的队列----数组队列
/*
    进队（enqueue）的复杂度(均摊)   O(1)
    出队（dequeue）的复杂度     O(n)  --底层是我们自己实现的动态数组，删除一个元素每个元素向前移动
    查看队首元素（getFront）的复杂度    O(1)
    getSize和isEmpty的复杂度        O(1)

    出队操作效率不是特别高，如何解决这个问题，--------使用循环队列

 */
public class ArrayQueue<E> implements Queue<E> {

    Array<E> array;

    public ArrayQueue(int capacity){
        array=new Array<>(capacity);
    }

    public ArrayQueue(){
        array=new Array<>();
    }

    @Override
    public int getSize(){
        return  array.getSize();
    }

    @Override
    public boolean isEmpty(){
        return  array.isEmpty();
    }

    public int getCapacity(){
        return array.getCapacity();
    }

    @Override
    public void enqueue(E e){
        //队尾进
        array.addLast(e);
    }

    @Override
    public E dequeue(){
        //队首出
        return array.removeFirst();
    }

    @Override
    public E getFront(){
        return array.getFirst();
    }

    @Override
    public String toString(){
        StringBuilder res = new StringBuilder();
        res.append("Queue:");
        res.append("front [");
        for(int i =0;i<array.getSize();i++){
            res.append(array.get(i));
            if(i!=array.getSize()-1)
                res.append(", ");
        }
        res.append("] tail");
        return res.toString();
    }

    public static void  main(String[] args){
        ArrayQueue<Integer> queue = new ArrayQueue<>();
        for(int i = 0 ; i < 10 ; i ++){
            queue.enqueue(i);
            System.out.println(queue);
            if(i % 3 == 2){
                queue.dequeue();
                System.out.println(queue);
            }
        }
    }

}
